﻿from flask import Flask, Response, request, render_template
from psycopg2 import pool
# from sqlalchemy import create_engine
import pandas as pd
import psycopg2

app = Flask(__name__)


def gp_connect():
    try:
        simple_conn_pool = pool.ThreadedConnectionPool(1, 10, host='adfdly.hdfdfzc.d345', user='esp',
                                                       password='Esdfsdfdsfs', database='esp',
                                                       port=9988
                                                       )
        # connect()也可以使用一个大的字符串参数,
        # 比如”host=localhost port=5432 user=postgres password=postgres dbname=test”
        # 从数据库连接池获取连接
        conn = simple_conn_pool.getconn()
        return conn
    except psycopg2.DatabaseError as e:
        print("could not connect to Greenplum server", e)


@app.route("/info", methods=['GET', ])
def sendinfo():
    # 获取到传入url中参数id对应的值
    # 连接数据库
    conn = gp_connect()

    # engine = create_engine(  'postgresql://userora:userora001@134.35.66.79:5128/useora')

    # 连接数据库
    # conn = psycopg2.connect(database='ai', user='ai',   password='ai001', host='127.0.0.1', port='5432')

    # curs = conn.cursor()

    # 编写Sql，只取前两行数据
    sql = "SELECT to_char(datenow,'yyyymmdd hh24:mi:ss'), vaules, s_id, k_id, up_addr, client_addr, s_kind FROM public.esp_insert order by    datenow desc  limit 10 ;"
    try:
        with conn:
            df = pd.read_sql_query(sql, conn)
            """
                    # 获得数据
                #

            # 如果是Series转json，默认的orient是'index'，orient可选参数有 {‘split','records','index'}

                如果是DataFrame转json，默认的orient是'columns'，orient可选参数有 {‘split','records','index','columns','values'}

                json的格式如下

                split，样式为 {index -> [index], columns -> [columns], data -> [values]}

                records，样式为[{column -> value}, … , {column -> value}]

                index ，样式为 {index -> {column -> value}}

                columns，样式为 {index -> {column -> value}}

                values，数组样式

                table，样式为{‘schema': {schema}, ‘data': {data}}，和records类似


            """
            # df = df.drop(['index'], axis=1)
            dd = df.to_json(orient='records')
            df = []
            # print(df)
            # print(pd_data)

            # 关闭指针和数据库
            # curs.close()
    except Exception as e:
        print(e)
        print('-------except')
        conn.close()
    finally:
        conn.close()

    # sendid = request.args.get('id')
    # s = "Get info id is " + str(sendid)
    # return jsonify(s)
    return Response(dd, mimetype='application/json')



'''
现在主流的Python web框架中，模板的表达式声明都大同小异，常见的有{{ something }}和{% something %}两类，而前者与Vue.js的语法冲突，导致在运行Python（例如Flask）时，Vue语法被Python解析触发报错。

对于Flask，解决该问题的方式最简单的就是在Vue实例的DOM外，通过声明raw，表示其中的内容不由flask转义即可解决冲突：

作者：严北
链接：https://www.jianshu.com/p/aa62701f7ebe
来源：简书
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
'''

@app.route("/" )
def root():
    return render_template('hello.html')

@app.route("/table", methods=['GET', ])
def sendtable():
    # 获取到传入url中参数id对应的值
    # 连接数据库
    conn = gp_connect()

    # engine = create_engine(  'postgresql://userora:userora001@134.35.66.79:5128/useora')

    # 连接数据库
    # conn = psycopg2.connect(database='ai', user='ai',   password='ai001', host='127.0.0.1', port='5432')

    # curs = conn.cursor()

    # 编写Sql，只取前两行数据
    sql = "SELECT to_char(datenow,'yyyymmdd hh24:mi:ss'), vaules, s_id, k_id, up_addr, client_addr, s_kind FROM public.esp_insert order by    datenow desc  limit 10 ;"
    try:
        with conn:
            df = pd.read_sql_query(sql, conn)
            """
                    # 获得数据
                #

            # 如果是Series转json，默认的orient是'index'，orient可选参数有 {‘split','records','index'}

                如果是DataFrame转json，默认的orient是'columns'，orient可选参数有 {‘split','records','index','columns','values'}

                json的格式如下

                split，样式为 {index -> [index], columns -> [columns], data -> [values]}

                records，样式为[{column -> value}, … , {column -> value}]

                index ，样式为 {index -> {column -> value}}

                columns，样式为 {index -> {column -> value}}

                values，数组样式

                table，样式为{‘schema': {schema}, ‘data': {data}}，和records类似


            """
            # df = df.drop(['index'], axis=1)

            html_string = '''
            <html>
              <head><title>HTML Pandas Dataframe with CSS</title></head>
              <link rel="stylesheet" type="text/css" href="\static\df_style.css"/>
              <body>
                <div align=center>{table}</div>
              </body>
            </html>
            '''
            # OUTPUT AN HTML FILE
            # with open('myhtml.html', 'w') as f:
            #  f.write(html_string.format(table=df.to_html(classes='mystyle',index=False)))
            '''
            buf：类似StringIO，可选

            缓冲区写入

            columns：sequence，可选

            要写的列的子集;
            默认为
            None写入所有列

            col_space：int，可选

            每列的最小宽度

            header：bool，可选

            是否打印列标签，默认为True

            index：bool，可选

            是否打印索引（行）标签，默认为True

            na_rep：string，可选

            要使用的NAN字符串表示，默认为
            'NaN'

            formatters：单参数函数的列表或字典，可选

            formatter函数按位置或名称应用于列的元素，默认为None。

            每个函数的结果必须是一个unicode字符串。列表的长度必须等于列数。

            float_format：单参数函数，可选

            formatter函数，如果它们是浮点数，则应用于列的元素，默认为None。

            此函数的结果必须是unicode字符串。

            sparsify：bool，可选

            对于具有分层索引的DataFrame，设置为False以在每行打印每个多索引键，

            默认为True

            index_names：bool，可选

            打印索引的名称，默认为True

            line_width：int，可选

            用字符包裹一行的宽度，默认没有换行

            table_id：str，可选

            由to_html创建的 < table > 元素的id

            版本0
            .23
            .0
            中的新功能。

            justify：str，默认None。

            如何证明列标签的合理性。如果None使用打印配置中的选项

             

            left
            right
            center
            justify
            justify - all
            start
            end
            inherit
            match - parent
            initial
            unset
            '''
            dd = html_string.format(table=df.to_html(classes='mystyle', index=False, justify='center',
                                                     float_format=lambda x: format(x, ',.0f')))
            df = []

            # print(pd_data)

            # 关闭指针和数据库
            # curs.close()
    except Exception as e:
        print(e)
        print('-------except')
        conn.close()
    finally:
        conn.close()

    # sendid = request.args.get('id')
    # s = "Get info id is " + str(sendid)
    # return jsonify(s)
    return dd


if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)
